home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / video / fly8111-.000 / fly8111- / fly8 / message.c < prev    next >
C/C++ Source or Header  |  1979-12-31  |  3KB  |  180 lines

  1. /* --------------------------------- message.c ------------------------------ */
  2.  
  3. /* This is part of the flight simulator 'fly8'.
  4.  * Author: Eyal Lebedinsky (eyal@ise.canberra.edu.au).
  5. */
  6.  
  7. /* Handle message queue for the display.
  8. */
  9.  
  10. #include "fly.h"
  11.  
  12. static int    MsgFlags = 0;
  13.  
  14. #define MSG_INITED    0x0001
  15.  
  16. LOCAL_FUNC HMSG * NEAR
  17. msg_add (const char *fmt, va_list ap, int ttl, int flags)
  18. {
  19.     HMSG    *q;
  20.     static char buf[256];
  21.  
  22.     vsprintf (buf, fmt, ap);
  23.  
  24.     if (ttl < 0) {
  25.         LogPrintf ("%s\n", buf);
  26.         ttl = -ttl;
  27.     }
  28.  
  29.     if (!(MsgFlags & MSG_INITED))
  30.         return (0);
  31.  
  32.     if (!NEW (q))
  33.         return (0);
  34.  
  35.     q->text = (char *)memory_alloc (strlen (buf) + 1);
  36.     if (!q->text) {
  37.         DEL0 (q);
  38.         return (0);
  39.     }
  40.     strcpy (q->text, buf);
  41.     q->timeout = (ttl ? st.present + 100L*ttl : 0);
  42.     q->flags = flags;
  43.     q->next = st.msg;
  44.     st.msg = q;
  45.  
  46.     if (st.quiet)
  47.         Snd->Effect (EFF_MSG, SND_ON);
  48.  
  49.     return (q);
  50. }
  51.  
  52. extern HMSG * FAR
  53. msg_del (const HMSG *p)
  54. {
  55.     HMSG    *q, *prev;
  56.  
  57.     if (!p)
  58.         return (NULL);
  59.  
  60.     for (prev = 0, q = st.msg; q && q != p; q = q->next)
  61.         prev = q;
  62.  
  63.     if (!q)
  64.         return (NULL);
  65.  
  66.     if (prev)
  67.         prev->next = q->next;
  68.     else
  69.         st.msg = q->next;
  70.     memory_free (q->text, strlen (q->text) + 1);
  71.     DEL (q);
  72.     return (NULL);
  73. }
  74.  
  75. extern HMSG *FAR
  76. MsgPrintf (int ttl, const char *fmt, ...)
  77. {
  78.     va_list    ap;
  79.     HMSG     FAR *msg;
  80.  
  81.     va_start (ap, fmt);
  82.     msg = msg_add (fmt, ap, ttl, 0);
  83.     va_end (ap);
  84.     return (msg);
  85. }
  86.  
  87. extern HMSG *FAR
  88. MsgEPrintf (int ttl, const char *fmt, ...)
  89. {
  90.     va_list    ap;
  91.     HMSG    FAR *msg;
  92.  
  93.     va_start (ap, fmt);
  94.     msg = msg_add (fmt, ap, ttl, MSG_ERR);
  95.     va_end (ap);
  96.     return (msg);
  97. }
  98.  
  99. extern HMSG *FAR
  100. MsgWPrintf (int ttl, const char *fmt, ...)
  101. {
  102.     va_list    ap;
  103.     HMSG    FAR *msg;
  104.  
  105.     va_start (ap, fmt);
  106.     msg = msg_add (fmt, ap, ttl, MSG_WARN);
  107.     va_end (ap);
  108.     return (msg);
  109. }
  110.  
  111. extern void FAR
  112. msg_show (int orgx, int orgy, int maxx, int maxy, int bss)
  113. {
  114.     HMSG    *q, *next;
  115.     int    c, x, y, x0, y0, y1, dx, dy;
  116.  
  117.     dx = dy = bss;
  118.  
  119.     x0 = orgx - maxx;
  120.     y0 = orgy + maxy;
  121.     y1 = orgy - maxy + dy;
  122.  
  123.     x = x0 + dx;
  124.     y = y0 - 2*dy;
  125.  
  126.     for (q = st.msg; q; q = next) {
  127.         next = q->next;
  128.         if (y < y1 ||
  129.             (q->timeout && q->timeout <= st.present)) {
  130.             q = msg_del (q);
  131.         } else {
  132.             if (VIS_REDBLUE == st.stereo)
  133.                 c = (q->flags & MSG_ERR) ? CC_WHITE
  134.                   : (q->flags & MSG_WARN) ? CC_WHITE
  135.                   : CC_LGRAY;
  136.             else
  137.                 c = (q->flags & MSG_ERR) ? CC_RED
  138.                   : (q->flags & MSG_WARN) ? CC_MAGENTA
  139.                   : ST_MFG;
  140.             stroke_str (x, y, q->text, bss, c);
  141.             y -= dy;
  142.         }
  143.     }
  144. }
  145.  
  146. extern void FAR
  147. msg_clear (int hard)
  148. {
  149.     HMSG    *q, *prev, *next;
  150.  
  151.     for (prev = NULL, q = st.msg; q; q = next) {
  152.         next = q->next;
  153.         if (hard || q->timeout) {
  154.             if (prev)
  155.                 prev->next = q->next;
  156.             else
  157.                 st.msg = q->next;
  158.             q = msg_del (q);
  159.         } else
  160.             prev = q;
  161.     }
  162. }
  163.  
  164. extern int FAR
  165. msg_init (void)
  166. {
  167.     msg_clear (1);
  168.     MsgFlags |= MSG_INITED;
  169.     return (0);
  170. }
  171.  
  172. extern void FAR
  173. msg_term (void)
  174. {
  175.     MsgFlags &= ~MSG_INITED;
  176.     msg_clear (1);
  177. }
  178.  
  179. #undef MSG_INITED
  180.